package org.supda.system.util;

import java.lang.reflect.Method;
import java.security.Timestamp;
import java.util.Date;

public class EntityUpdataUtils{
	
	/**
	 * 将对象修改过的值更新到旧有的实体类
	 * @param t 类对象
	 * @param source source旧数据
	 * @param target 新数据
	 * @return
	 */
	public static <T> T update(Class<T> t , T source , T target){
		
		if(t == null){
			throw new RuntimeException("数据更新的类对象不能为null");
		}
		
		//反射所有的方法
		Method[] methods = t.getMethods();
			
			for( int j = 0 ; j < methods.length ; j ++){
				if(methods[j].getName().startsWith("get")){
					Method targetMethod = 	methods[j];
				
					try {
						//只对基本数据类型的值更新，其他值替换
						if(IsBasicType( targetMethod.getReturnType())){
							Object	targetValue = targetMethod.invoke(target);
							
							if(targetValue != null){
								
								String setmethod = targetMethod.getName().replace("get", "set");
								for( int i = 0 ; i < methods.length ; i ++){
									if(setmethod.equalsIgnoreCase(methods[i].getName())){
										
										methods[i].invoke(source, targetValue);
									}
								}
							}
						}
						
					} catch (Exception e) {
						
					}
						
				}
			}
		
		return source;
	}
	
	
	/**
	 * 是否为基本数据类型
	 * @param clazz
	 * @return
	 */
	public static boolean IsBasicType( Class<?> clazz) {
		
		return (clazz == Integer.class
					||clazz == String.class
					||clazz == Timestamp.class
					||clazz == Boolean.class
					||clazz == Double.class
					||clazz == Date.class
					||clazz == Float.class
					||clazz == Long.class
					||clazz == Short.class)? true:false;
				
	}
}
